﻿namespace StockSharp.Algo.Indicators.Oscillator
{
	using System.ComponentModel;

	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Indicators.Misc;

	/// <summary>
	/// Стохастик %K.
	/// </summary>
	[DisplayName("Стохастик %K")]
	[Description("Стохастик %K.")]
	public class StochasticK : LengthIndicator<decimal>
	{
		// Минимальная цена за период.
		private readonly Lowest _low = new Lowest();

		// Максимальная цена за период.
		private readonly Highest _high = new Highest();

		/// <summary>
		/// Создать <see cref="StochasticK"/>.
		/// </summary>
		public StochasticK()
			: base(typeof(Candle))
		{
		}

		/// <summary>
		/// Длина периода.
		/// </summary>
		public override int Length
		{
			get
			{
				return _low.Length;
			}
			set
			{
				_high.Length = _low.Length = value;
				Reset();
			}
		}

		/// <summary>
		/// Индикатор сформирован.
		/// </summary>
		public override bool IsFormed { get { return _high.IsFormed; } }

		/// <summary>
		/// Обработать входное значение.
		/// </summary>
		/// <param name="input">Входное значение.</param>
		/// <returns>Результирующее значение.</returns>
		protected override decimal OnProcess(IIndicatorValue input)
		{
			var candle = input.GetValue<Candle>();

			var highValue = _high.Process(input.SetValue(candle.HighPrice)).GetValue<decimal>();
			var lowValue = _low.Process(input.SetValue(candle.LowPrice)).GetValue<decimal>();

			return 100 * (candle.ClosePrice - lowValue) / (highValue - lowValue);
		}
	}
}